package org.groupg.demo.eclipse;

import org.eclipse.collections.api.bag.ImmutableBag;
import org.eclipse.collections.api.list.ImmutableList;
import org.eclipse.collections.api.map.ImmutableMap;
import org.eclipse.collections.api.set.ImmutableSet;
import org.eclipse.collections.impl.factory.Bags;
import org.eclipse.collections.impl.factory.Lists;
import org.eclipse.collections.impl.factory.Maps;
import org.eclipse.collections.impl.factory.Sets;

/**
 * 不可变集合示例
 * <p>
 * 特点：
 * 1. 创建后内容不可修改（任何修改操作会抛出UnsupportedOperationException）
 * 2. 线程安全（因为状态不可变）
 * 3. 更节省内存（可能共享内部数据结构）
 * 4. 适合作为常量或安全共享数据
 */
public class ImmutableCollectionsExample {
    public static void main(String[] args) {
        // 创建不可变List - 创建后不能添加/删除元素
        ImmutableList<String> immutableList = Lists.immutable.of("A", "B", "C");
        // immutableList.add("D"); // 尝试修改会抛出 UnsupportedOperationException
        System.out.println("Immutable List: " + immutableList);

        // 创建不可变Set
        ImmutableSet<Integer> immutableSet = Sets.immutable.of(1, 2, 3);
        System.out.println("Immutable Set: " + immutableSet);

        // 创建不可变Map
        ImmutableMap<String, String> immutableMap = Maps.immutable.of("Key1", "Val1", "Key2", "Val2");
        System.out.println("Immutable Map: " + immutableMap);

        // 创建不可变Bag - 可统计元素出现次数
        ImmutableBag<String> immutableBag = Bags.immutable.of("Red", "Red", "Blue");
        System.out.println("Immutable Bag: " + immutableBag);
        System.out.println("Red出现次数: " + immutableBag.occurrencesOf("Red"));

        // 通过已有集合创建不可变版本
        ImmutableList<String> fromMutable = Lists.mutable.of("X", "Y", "Z").toImmutable();
        System.out.println("从可变集合创建的不可变List: " + fromMutable);
    }
}